package Modelo;
 
import java.sql.*;
// CRUD para Canales
 
public class Canales {
 
    Connection con;
 
    public Canales() {
 
        this.con = Conexion.getConexion();
    }
// Obtener servicios
 
    public Object[][] getCanales() {
 
        Object[][] filas = null;
        try {
            Statement query = this.con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            ResultSet res = query.executeQuery("SELECT id_canal, nombre FROM Canales");
            //Clase para obtener más datos sobre la consulta
            ResultSetMetaData resmd = res.getMetaData();
            //Obtengo el total de columnas de la consulta
            int totalColumnas = resmd.getColumnCount();
            res.last();
            //obtengo el total de filas
            int totalFilas = res.getRow();
            res.beforeFirst();
 
            //Creo el objeto filas
            filas = new Object[totalFilas][totalColumnas];
 
            //Mientras hallan resultados poblo el objeto filas para luego devolverlo
            while (res.next()) {
                for (int i = 0; i < totalColumnas; i++) {
                    filas[(res.getRow() - 1)][i] = res.getString((i + 1));
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
 
        return filas;
    }
 
    public Object[][] getCanalesByCliente(String rut) {
        Object[][] filas = null;
        try {
            PreparedStatement query = this.con.prepareStatement("SELECT can.nombre "
                    + "FROM CanalesExtra as canex INNER JOIN Canales as can "
                    + "ON canex.id_canal = can.id_canal "
                    + "WHERE cliente_rut=?");
            query.setString(1, rut);
            ResultSet res = query.executeQuery();
 
            //Clase para obtener más datos sobre la consulta
            ResultSetMetaData resmd = res.getMetaData();
            //Obtengo el total de columnas de la consulta
            int totalColumnas = resmd.getColumnCount();
            res.last();
            //obtengo el total de filas
            int totalFilas = res.getRow();
            res.beforeFirst();
 
            //Creo el objeto filas
            filas = new Object[totalFilas][totalColumnas];
 
            //Mientras hallan resultados poblo el objeto filas para luego devolverlo
            while (res.next()) {
                for (int i = 0; i < totalColumnas; i++) {
                    filas[(res.getRow() - 1)][i] = res.getString((i + 1));
                }
            }
            query.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
 
        return filas;
    }
 
    public Object[][] getCanalesNoTieneCliente(String rut) {
        Object[][] filas = null;
        try {
            PreparedStatement query = this.con.prepareStatement("SELECT nombre FROM Canales "
                    + "WHERE id_canal NOT IN( SELECT id_canal FROM CanalesExtra WHERE cliente_rut=? )");
            query.setString(1, rut);
            ResultSet res = query.executeQuery();
 
            //Clase para obtener más datos sobre la consulta
            ResultSetMetaData resmd = res.getMetaData();
            //Obtengo el total de columnas de la consulta
            int totalColumnas = resmd.getColumnCount();
            res.last();
            //obtengo el total de filas
            int totalFilas = res.getRow();
            res.beforeFirst();
 
            //Creo el objeto filas
            filas = new Object[totalFilas][totalColumnas];
 
            //Mientras hallan resultados poblo el objeto filas para luego devolverlo
            while (res.next()) {
                for (int i = 0; i < totalColumnas; i++) {
                    filas[(res.getRow() - 1)][i] = res.getString((i + 1));
                }
            }
            query.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
 
        return filas;
    }
 
// Eliminar Servicio.
    public void deleteCanal(int id_canal) {
        try {
            PreparedStatement query = this.con.prepareStatement("DELETE FROM Canales WHERE id_canal=?");
            query.setInt(1, id_canal);
            query.executeUpdate();
            query.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
// Agregar servicio
 
    public boolean addCanal(String nombre) {
 
        if (this.existeCanal(nombre.trim())) {
            Funciones.mensaje("El canal ya existe, prueba con otro");
            return false;
        }
        try {
            PreparedStatement query = this.con.prepareStatement("INSERT INTO Canales (nombre) values (?);");
            query.setString(1, nombre.trim());
 
            query.executeUpdate();
            query.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
 
        return true;
    }
 
    // Comprobar si ya existe el servicio.
    public boolean existeCanal(String nombre) {
        boolean existe = false;
        try {
            PreparedStatement query = this.con.prepareStatement("SELECT id_canal FROM Canales WHERE nombre=?");
            query.setString(1, nombre.trim());
            query.executeQuery();
            ResultSet res = query.executeQuery();
 
            if (res.next()) {
                existe = true;
            } else {
                existe = false;
            }
            query.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
 
        return existe;
    }
 
    // Modificar servicio
    public void updateCanal(String nombre, int id) {
        try {
            if (this.existeCanal(nombre.trim())) {
                Funciones.mensaje("El canal ya existe, prueba con otro");
                return;
            }
            PreparedStatement pstm = this.con.prepareStatement("update Canales "
                    + "set nombre= ? "
                    + "where id_canal = ? ");
            pstm.setString(1, nombre);
            pstm.setInt(2, id);
            pstm.execute();
            pstm.close();
        } catch (SQLException e) {
            System.out.println(e);
        }
    }
 
    public boolean existeCanalExtra(String rut, int id_canal) {
        boolean existe = false;
        try {
            PreparedStatement query = this.con.prepareStatement("SELECT id_canal_extra FROM CanalesExtra "
                    + "WHERE cliente_rut=? AND id_canal=?");
            query.setString(1, rut.trim());
            query.setInt(2, id_canal);
            query.executeQuery();
            ResultSet res = query.executeQuery();
 
            if (res.next()) {
                existe = true;
            } else {
                existe = false;
            }
            query.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
 
        return existe;
    }
 
    //Añadir canal a cliente
    public boolean addCanalToCliente(String rut, int id_canal) {
 
        if (this.existeCanalExtra(rut, id_canal)) {
            Funciones.mensaje("El canal ya lo posee el cliente");
            return false;
        }
        try {
            PreparedStatement query = this.con.prepareStatement("INSERT INTO CanalesExtra (cliente_rut, id_canal)"
                    + " values (?, ?);");
            query.setString(1, rut.trim());
            query.setInt(2, id_canal);
            query.executeUpdate();
            query.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
 
        return true;
    }
 
    public int getIdCanalByNombre(String nombre) {
        int id_canal = -1;
        try {
            PreparedStatement query = this.con.prepareStatement("SELECT id_canal FROM Canales "
                    + "WHERE nombre=?");
            query.setString(1, nombre.trim());
            ResultSet res = query.executeQuery();
            //Clase para obtener más datos sobre la consulta
            ResultSetMetaData resmd = res.getMetaData();
            //Obtengo el total de columnas de la consulta
            int totalColumnas = resmd.getColumnCount();
 
            //Creo el objeto filas
            //Si existe el cliente
            if (res.next()) {
                for (int i = 0; i < totalColumnas; i++) {
                    id_canal = res.getInt(i + 1);
                }
            } else {
                return -1;
            }
 
            query.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
 
        return id_canal;
    }
 
    public void deleteCanalExtra(String rut, int id_canal) {
        try {
            PreparedStatement query = this.con.prepareStatement("DELETE FROM CanalesExtra "
                    + "WHERE cliente_rut=? AND id_canal=?");
            query.setString(1, rut);
            query.setInt(2, id_canal);
            query.executeUpdate();
            query.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
}